home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Eagles Nest BBS 8
/
Eagles_Nest_Mac_Collection_Disc_8.TOAST
/
Developer Tools⁄Additions
/
InsideBa1994
/
InsideBasic-94
/
IB 94
/
Apple Events
/
AEServer.bas
< prev
next >
Wrap
BASIC Source File
|
1993-08-30
|
16KB
|
497 lines
WINDOW OFF:COORDINATE WINDOW
RESOURCES "server.res","APPLAESV"
'=================================================
' AEServer
' Michael W. Faulkner
' Inveterate Insomniac, Inc.
' Began 6/12/93 08:25 GMT
' Last Modified: 8/29/93
'
' For brevity sake, I'll only comment
' the functions that are important for
' this example program
'=================================================
'***************************************************************
'*
'* CDEF Button references and menu items
'*
'***************************************************************
_kAEOpenApp = 1
_kAEOpenDoc = 2
_kAEPrintDoc = 3
_kAEQuitApp = 4
_fileMenu = 2
_receiverItem = 1
_quitItem = 2
'=================================================
' Constants for Apple Events needed by
' this program.
'
'=================================================
_errAEDescNotFound = -1701
_errAEEventNotHandled = -1708
_typeLongInteger = _"long"
_kCoreEventClass = _"aevt"
_kAEOpenApplication = _"oapp"
_kAEOpenDocuments = _"odoc"
_kAEPrintDocuments = _"pdoc"
_kAEQuitApplication = _"quit"
_typeAEList = _"list"
_typeFSS = _"fss "
_keyDirectObject = _"----"
_keyErrorNumber = _"errn"
_kAENoReply = 1
_kAEQueueReply = 2
_kAEWaitReply = 3
_kAENeverInteract = 16
_kAECanInteract = 32
_kAEAlwaysInteract = 48
_kAECanSwitchLayer = 64
_kAEDontReconnect = 128
_kAutoGenerateReturnID = -1
_kTransactionID = 1
_kAEDefaultTimeout = -1
_kAENormalPriority = 0
_nil = &00000000
_sizeOfSign = &00000004
_typeApplSignature = _"sign"
_typeWildCard = _"****"
_AECL = _"AECL"
_AESV = _"AESV"
_keyMissedKeywordAttr = _"miss"
_AECustomClass = _"cstm"
_AECustomEventID = _"mssg"
'***************************************************************
'*
'* Apple Event Record Structures
'*
'***************************************************************
DIM RECORD AEDesc
DIM descType&
DIM descHandle&
DIM END RECORD _AEDesc
DIM RECORD AEKeyDesc
DIM descKey&
DIM descContent.AEDesc
DIM END RECORD _AEKeyDesc
DIM RECORD AEAddressDesc
DIM addressDesc.AEDesc
DIM END RECORD _AEAddressDesc
DIM RECORD AEDescList
DIM descList.AEDesc
DIM END RECORD _AEDescList
DIM RECORD AERecord
DIM recordDesList.AEDescList
DIM END RECORD _AERecord
DIM RECORD AppleEvent
DIM AEEventRecord.AERecord
DIM END RECORD _AppleEvent
END GLOBALS
GOTO "main"
'**************************************************************
'*
'* FN AECreateDesc(typeCode&,dataPtr&,dataSize&,result&)
'*
'* Creates a new AEDesc Record for the AppleEvent
'* we need to build.
'*
'* Selector: #$0825
'* Trap: $A816 (_pack8)
'*
'* Local variables: none
'*
'* On entry:
'* typeCode& - long: type descriptor for AEDesc record
'* dataPtr& - long: pointer to data for record
'* dataSize& - long: size of data in bytes
'* result& - long: pointer to uninitialized AEDesc record
'*
'* On exit:
'* result passed in D0
'**************************************************************
LOCAL MODE
LOCAL FN AECreateDesc(typeCode&,dataPtr&,dataSize&,result&)
` clr.w -(sp)
` move.l ^typeCode&,-(sp)
` move.l ^dataPtr&,-(sp)
` move.l ^dataSize&,-(sp)
` move.l ^result&,-(sp)
` move.w #$0825,D0
` dc.w $A816
` move.w (sp)+,D0
` ext.l D0
END FN
'**************************************************************
'*
'* FN AECreateAppleEvent(evtClass&,evtID&,desc&,returnID%,transID&,result&)
'*
'* Creates new AppleEvent from AEDesc record
'*
'* Selector: #$0B14
'* Trap: $A816 (_pack8)
'* Local variables: none
'*
'* On entry:
'* evtClass& - long: event class of the new AppleEvent
'* evtID& - long: event ID of new AppleEvent
'* desc& - long: pointer to AEDesc record
'* returnID% - integer: returnID generation flag
'* transID& - long: transaction ID
'* result& - long: pointer to record of type AppleEvent
'*
'* On exit:
'* result passed in D0
'**************************************************************
LOCAL MODE
LOCAL FN AECreateAppleEvent(evtClass&,evtID&,desc&,returnID%,transID&,result&)
` subq.l #2,sp
` move.l ^evtClass&,-(sp)
` move.l ^evtID&,-(sp)
` move.l ^desc&,-(sp)
` move.w ^returnID%,-(sp)
` move.l ^transID&,-(sp)
` move.l ^result&,-(sp)
` move.w #$0B14,D0
` dc.w $A816
` move.w (sp)+,D0
` ext.l D0
END FN
'**************************************************************
'*
'* FN AESend(aevent&,aereply&,interaction&,priority&,timeout%,idleProc&,filterProc&)
'*
'* Sends the new AppleEvent on its merry way
'*
'* Selector: #$0D17
'* Trap: $A816 (_pack8)
'* Local variables: none
'*
'* On entry:
'* aevent& - long: pointer to AppleEvent
'* aereply& - long: pointer to AppleEvent reply record
'* interaction& - long: level of user interaction
'* priority& - long: priority of AppleEvent
'* timeout% - integer: timeout in ticks (-1 = 60 secs)
'* idleProc& - long: pointer to sys idle procedure (valid only if no timeout specified)
'* filterProc& - long: pointer to AEFilter procedure (valid only if no timeout specified)
'*
'* On exit:
'* result passed in D0
'**************************************************************
LOCAL MODE
LOCAL FN AESend(aevent&,aereply&,interaction&,priority&,timeout%,idleProc&,filterProc&)
` subq.l #2,sp
` move.l ^aevent&,-(sp)
` move.l ^aereply&,-(sp)
` move.l ^interaction&,-(sp)
` move.l ^priority&,-(sp)
` move.w ^timeout%,-(sp)
` move.l ^idleProc&,-(sp)
` move.l ^filterProc&,-(sp)
` move.w #$0D17,D0
` dc.w $A816
` move.w (sp)+,D0
` ext.l D0
END FN
'******************************************************************
'*
'* FN AEPutParamPtr(newEvent&,keyword&,desc&,ptr&,dataSize&)
'*
'* Attaches a parameter to a valid Apple event
'*
'* Selector: #$0A0F
'* Trap: $A816
'*
'* On Entry:
'* newEvent& : long -- pointer to Apple event
'* keyWord& : long -- keyword which describes parameter
'* desc& : long -- type descriptor for parameter
'* ptr& : long -- pointer to data
'* dataSize& : long -- size of data pointed to
'*
'* On exit:
'* result passed in D0
'******************************************************************
LOCAL MODE
LOCAL FN AEPutParamPtr(newEvent&,keyword&,desc&,ptr&,dataSize&)
` subq.l #2,sp
` move.l ^newEvent&,-(sp)
` move.l ^keyword&,-(sp)
` move.l ^desc&,-(sp)
` move.l ^ptr&,-(sp)
` move.l ^dataSize&,-(sp)
` move.w #$0A0F,D0
` dc.w $A816
` move.w (sp)+,D0
` ext.l D0
END FN
'******************************************************************
'*
'* FN AEGetAttributePtr(theAEvent&,keyWord&,desiredType&,returnType&,bufferPtr&,bufferSize&,actualSize&)
'*
'* Given an Apple event, extracts an attribute and places it in
'* the buffer provided.
'*
'* Selector: #$0E15
'* Trap: $A816
'*
'* On entry:
'* theAEvent& : long -- pointer to Apple event
'* keyWord& : long -- keyword of the attribute
'* desiredType& : long -- the type descriptor the attribute is to be returned as
'* returnType& : long -- the returned type descriptor of the attribute
'* bufferPtr& : long -- pointer to buffer for the returned attribute
'* bufferSize& : long -- size of the buffer
'* actualSize& : long -- buffer for size to be returned to
'*
'* On exit:
'* result returned in D0
'******************************************************************
LOCAL MODE
LOCAL FN AEGetAttributePtr(theAEvent&,keyWord&,desiredType&,returnType&,bufferPtr&,bufferSize&,actualSize&)
` clr.w -(sp)
` move.l ^theAEvent&,-(sp)
` move.l ^keyWord&,-(sp)
` move.l ^desiredType&,-(sp)
` move.l ^returnType&,-(sp)
` move.l ^bufferPtr&,-(sp)
` move.l ^bufferSize&,-(sp)
` move.l ^actualSize&,-(sp)
` move.w #$0E15,D0
` dc.w $A816
` move.w (sp)+,D0
` ext.l D0
END FN
'***************************************************************
LOCAL FN InitWindow
LONG IF WINDOW(-1) = _nil
DIM wRect.8 'Eight bytes for rectangle
DIM eRect.8 'Eight bytes for rectangle
DIM title$
title$ = "AEvent Demo"
CALL SETRECT(wRect,10,50,300,200)
CALL SETRECT(eRect,10,10,200,25)
WINDOW #1,title$,@wRect,_docNoGrow
EDIT FIELD #1,"",@eRect,_statFramed
END IF
END FN
'**************************************************************
'*
'* Apple Event handlers: All ignored
'*
'**************************************************************
'**************************************************************
'*
'* AEOpenApplication
'*
'**************************************************************
"AEOpenApp"
ENTERPROC(procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
EDIT FIELD 1,"AEOpenApplication"
err = _noErr
EXITPROC = err
'**************************************************************
'*
'* AEQuitApplication
'*
'**************************************************************
"AEQuitApp"
ENTERPROC(procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
'ignored
err = _noErr
EDIT FIELD 1,"AEQuitApplication"
END
EXITPROC = err
'**************************************************************
'*
'* AEPrintDocuments
'*
'**************************************************************
"AEPrintDocs"
ENTERPROC(procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
'Ignored
EDIT FIELD 1,"AEPrintDocuments"
EXITPROC
'**************************************************************
'*
'* AEOpenDocuments
'*
'**************************************************************
"AEOpenDocs"
ENTERPROC(procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
'Ignored
EDIT FIELD 1,"AEOpenDocuments"
err = _noErr
EXITPROC = err
'***************************************
'*
'* FN CheckError(err)
'*
'* Cheeper than dirt error handler...
'*
'******************************************
LOCAL FN CheckError(theErr) 'See if error occured at calling routine
DIM whichErr$ 'Space for string
DIM junk 'Don't care about button hit this time around
LONG IF theErr <> _noErr 'Oops. Non-zero if error
whichErr$ = STR$(theErr) 'Convert error to string
CALL PARAMTEXT(whichErr$,"","","") 'Shove it into alert
junk = FN ALERT(128,_nil) 'Notify user dude
END IF 'Done
END FN = theErr 'Return error to caller
'***************************************************************
'*
'* "handleCustomEvent"
'*
'* Once dropped into this handler, first, get the descriptor
'* record which has the text (ok, describes the parameter).
'* Then,, get the length of the text by retreiving the size
'* of the handle. Finally, BLOCKMOVE the text into our local
'* string.
'*
'***************************************************************
"handleCustomEvent"
ENTERPROC (procAEvtPtr&,procAEvtReplyPtr&,procAEvtRefCon&)
DIM result.AEDesc 'Work space for a copy of descriptor
DIM theText$ 'Buffer for text
DIM typeCode& 'For returned type
OSErr = _noErr 'Assume all goody goody
osErr = FN AEGETPARAMDESC (procAEvtPtr&,_keyDirectObject,_typeChar,result)
LONG IF osErr = _noErr
sz& = FN GETHANDLESIZE(result.descHandle&)'Lenght of text
IF sz& > 255 sz& = 255 'Don't pass end-o-buffer
POKE @theText$,sz& 'Set-up length byte
BLOCKMOVE [result.descHandle&],@theText$+1,sz&'Got it!
theText$ = "You sent: "+theText$ 'String for reply
'Now, add are adjusted string to the Apple Event reply
OSErr = FN AEPutParamPtr(procAEvtReplyPtr&,_keyDirectObject,_typeChar,@theText$+1,LEN(theText$))
LONG IF OSErr = _noErr
EDIT FIELD 1,theText$
XELSE
EDIT FIELD 1,"Error occured"
END IF
XELSE
EDIT FIELD 1,"Error"
END IF
OSErr = FN AEDISPOSEDESC(#@result) 'Done with result so tank it
'See if we missed any other attributes
OSErr = FN AEGetAttributePtr(procAEvtPtr&,_keyMissedKeyWordAttr,_typeWildCard,@typeCode&,_nil,_nil,@sz&)
IF OSErr = _errAEDescNotFound err& = _noErr ELSE err& = _errAEEventNotHandled
'Put the error code in the reply to send back
OSErr = FN AEPutParamPtr(procAEvtReplyPtr&,_keyErrorNumber,_typeLongInteger,@err&,4)
EXITPROC = OSErr
'***************************************************************
'*
'* Try to install the Apple event handlers. If we
'* can't, just end the program
'*
'***************************************************************
LOCAL FN InstallAEvents
LONG IF SYSTEM(_sysVers) > 699
LONG IF FN GESTALT(_gestaltAppleEventsAttr)
&EVENT -8,3
gAEEventProcPtr& = LINE"AEOpenApp"
err = FN AEINSTALLEVENTHANDLER(_kCoreEventClass, _kAEOpenApplication,gAEEventProcPtr&,_false,_false)
LONG IF err = _noErr
gAEEventProcPtr& = LINE"AEQuitApp"
err = FN AEINSTALLEVENTHANDLER(_kCoreEventClass, _kAEQuitApplication,gAEEventProcPtr&,_false,_false)
LONG IF err = _noErr
gAEEventProcPtr& = LINE"AEOpenDocs"
err = FN AEINSTALLEVENTHANDLER(_kCoreEventClass, _kAEOpenDocuments,gAEEventProcPtr&,_false,_false)
LONG IF err = _noErr
gAEEventProcPtr& = LINE"AEPrintDocs"
err = FN AEINSTALLEVENTHANDLER(_kCoreEventClass, _kAEPrintDocuments,gAEEventProcPtr&,_false,_false)
LONG IF err = _noErr
gAEEventProcPtr& = LINE"handleCustomEvent"
err = FN AEINSTALLEVENTHANDLER(_AECustomClass,_AECustomEventID,gAEEventProcPtr&,_false,_false)
END IF
END IF
END IF
END IF
END IF
END IF
IF err <> _noErr THEN END
END FN
'***************************************************************
LOCAL FN DoMenu
menuID = MENU(_menuID) : menuItem = MENU(_itemID)'Get details
SELECT menuID 'Only one menu anyway
CASE _fileMenu 'Still only one menu
SELECT menuItem 'Which item?
CASE _quitItem 'Bye suka
END
CASE _receiverItem 'Build me a window
FN InitWindow
END SELECT
END SELECT
MENU 'Clean-up highlite
END FN 'Outta here
'***************************************************************
LOCAL FN DoDialog
evnt = DIALOG(0) : id = DIALOG(evnt) 'Which control?
SELECT evnt
CASE _wndClose 'Only want close box
WINDOW CLOSE 1 'Bye Bye
END SELECT
END FN
'***************************************************************
"main"
FN InstallAEvents
FN InitWindow
ON MENU FN DoMenu
ON DIALOG FN DoDialog
DO
HANDLEEVENTS
UNTIL RomulansJoinTheFederationAndBecomeNice
END